package kn.tool.http;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.StreamProgress;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import kn.tool.core.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: dengkunnan
 * @date: 2020-07-12 02:11
 * @description:
 **/
@Slf4j
public class HttpClienFileUtil {
    /**
     * 文件上传只需将参数中的键指定（默认file），值设为文件对象即可，对于使用者来说，文件上传与普通表单提交并无区别
     *
     * @param url       请求url
     * @param file      上传文件
     * @param headerMap 请求头
     * @param paramMap  请求参数
     * @return 请求结果对象
     */
    public static HttpResponse post(String url, Map<String, Object> headerMap, File file, HashMap<String, Object> paramMap) {
        HashMap<String, Object> thisParamMap = new HashMap<>();
        if (!ObjectUtil.isNull(paramMap)) {
            thisParamMap = paramMap;
        }

        thisParamMap.put("file", file);
        HttpRequest httpRequest = new HttpRequest(url);
        for (String key : headerMap.keySet()) {
            httpRequest.header(key, headerMap.get(key).toString());
        }
        httpRequest.form(thisParamMap);
        httpRequest.timeout(3000);
        return httpRequest.execute();
    }


    /**
     * 下载文件
     *
     * @param fileUrl     httpUrl
     * @param locahostUrl 本地路径
     * @return /将文件下载后保存在，返回结果为下载文件大小
     */
    public static long downloadFile(String fileUrl, String locahostUrl) {
        return HttpUtil.downloadFile(fileUrl, FileUtil.file(locahostUrl));
    }


    /**
     * 下载文件
     *
     * @param fileUrl     httpUrl
     * @param locahostUrl 本地路径
     * @return /将文件下载后保存在，返回结果为下载文件大小
     */
    public static void downloadFileAndHaveSpeedOfProgress(String fileUrl, String locahostUrl) {
        //带进度显示的文件下载
        HttpUtil.downloadFile(fileUrl, FileUtil.file(locahostUrl), new StreamProgress() {

            @Override
            public void start() {
                log.info("开始下载。。。。");
            }

            @Override
            public void progress(long progressSize) {
                log.info("已下载：{}", FileUtil.readableFileSize(progressSize));
            }

            @Override
            public void finish() {
                log.info("下载完成！");
            }
        });
    }

}
